﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.IO;
using DO = DataObjects;
using DM = DataMapping;

namespace DataAccess
{
    public class FornecedorDB
    {
        #region Metodos Publicos

        public static DO.Fornecedor GetItem(int id)
        {
            using (DM.DataMappingDataContext dc = new DM.DataMappingDataContext())
            {
                DM.Fornecedor fornecedor = (from f in dc.Fornecedors
                                            where f.IdFornecedor == id
                                            select f).FirstOrDefault();
                return FillRecord(fornecedor);
            }
        }

        public static List<DO.Fornecedor> GetList()
        {
            using (DM.DataMappingDataContext dc = new DM.DataMappingDataContext())
            {
                List<DM.Fornecedor> fornecedorList = (from f in dc.Fornecedors
                                                      select f).ToList();

                List<DO.Fornecedor> fornecedorListReturn = new List<DO.Fornecedor>();
                foreach (DM.Fornecedor c in fornecedorList)
                    fornecedorListReturn.Add(FillRecord(c));

                return fornecedorListReturn;
            }
        }

        public static int Save(DO.Fornecedor fornecedor)
        {
            using (DM.DataMappingDataContext dc = new DM.DataMappingDataContext())
            {
                DM.Fornecedor fornecedorDB = (from f in dc.Fornecedors
                                              where f.IdFornecedor == fornecedor.Id
                                              select f).FirstOrDefault();

                if (fornecedorDB == null)
                {
                    fornecedorDB = new DM.Fornecedor();
                    
                    fornecedorDB.TipoFornecedor = fornecedor.TipoFornecedor;
                    fornecedorDB.RazaoSocial = fornecedor.RazaoSocial;
                    fornecedorDB.NomeFantasia = fornecedor.NomeFantasia;
                    fornecedorDB.Cnpj = fornecedor.Cnpj;
                    fornecedorDB.FoneAberto = fornecedor.FoneAberto;
                    fornecedorDB.DtAbertura = fornecedor.DtAbertura;
                    fornecedorDB.NomeCompleto = fornecedor.NomeCompleto;
                    fornecedorDB.CPF = fornecedor.Cpf;
                    fornecedorDB.DtNascimento = fornecedor.DtNascimento;
                    fornecedorDB.FoneFixoComercial = fornecedor.FoneFixoComercial;
                    fornecedorDB.FoneFixoResidencial = fornecedor.FoneFixoResidencial;
                    fornecedorDB.Celular1 = fornecedor.Celular1;
                    fornecedorDB.Celular2 = fornecedor.Celular2;
                    fornecedorDB.Email = fornecedor.Email;
                    fornecedorDB.Logradouro = fornecedor.Logradouro;
                    fornecedorDB.Numero = fornecedor.Numero;
                    fornecedorDB.Complemento = fornecedor.Complemento;
                    fornecedorDB.Bairro = fornecedor.Bairro;
                    fornecedorDB.Cidade = fornecedor.Cidade;

                    dc.Fornecedors.InsertOnSubmit(fornecedorDB);
                }
                else
                {
                    fornecedorDB.IdFornecedor = fornecedor.Id;
                    fornecedorDB.TipoFornecedor = fornecedor.TipoFornecedor;
                    fornecedorDB.RazaoSocial = fornecedor.RazaoSocial;
                    fornecedorDB.NomeFantasia = fornecedor.NomeFantasia;
                    fornecedorDB.Cnpj = fornecedor.Cnpj;
                    fornecedorDB.FoneAberto = fornecedor.FoneAberto;
                    fornecedorDB.DtAbertura = fornecedor.DtAbertura;
                    fornecedorDB.NomeCompleto = fornecedor.NomeCompleto;
                    fornecedorDB.CPF = fornecedor.Cpf;
                    fornecedorDB.DtNascimento = fornecedor.DtNascimento;
                    fornecedorDB.FoneFixoComercial = fornecedor.FoneFixoComercial;
                    fornecedorDB.FoneFixoResidencial = fornecedor.FoneFixoResidencial;
                    fornecedorDB.Celular1 = fornecedor.Celular1;
                    fornecedorDB.Celular2 = fornecedor.Celular2;
                    fornecedorDB.Email = fornecedor.Email;
                    fornecedorDB.Logradouro = fornecedor.Logradouro;
                    fornecedorDB.Numero = fornecedor.Numero;
                    fornecedorDB.Complemento = fornecedor.Complemento;
                    fornecedorDB.Bairro = fornecedor.Bairro;
                    fornecedorDB.Cidade = fornecedor.Cidade;
                }

                try
                {
                    dc.SubmitChanges();
                    return fornecedorDB.IdFornecedor;
                }
                catch (Exception ex)
                {
                    string date = ((DateTime.Now).ToString()).Substring(0, 9);
                    date = date.Replace('/', '-');
                    string location = "\\\\Servidor\\SharedDocs\\Aplicação\\Log";
                    string path = (String.Format("{0}{1}\\Problema Gravação_{2}.txt", @"", location, date));
                    StreamWriter valor = new StreamWriter(path, true, Encoding.ASCII);
                    valor.WriteLine("Erro ao salvar: " + fornecedorDB.IdFornecedor);
                    valor.WriteLine(ex.Message);
                    valor.WriteLine("------------------------------------------------------");
                    valor.Close();

                    dc.ChangeConflicts.ResolveAll(RefreshMode.OverwriteCurrentValues);
                    dc.SubmitChanges();

                    return -1;
                }
            }
        }

        public static bool Delete(int id)
        {
            using (DM.DataMappingDataContext dc = new DM.DataMappingDataContext())
            {
                DM.Fornecedor fornecedorDB = (from f in dc.Fornecedors
                                              where f.IdFornecedor == id
                                              select f).FirstOrDefault();

                if (fornecedorDB != null)
                {
                    try
                    {
                        dc.Fornecedors.DeleteOnSubmit(fornecedorDB);
                        dc.SubmitChanges();
                        return true;
                    }
                    catch (Exception ex)
                    {
                        string date = ((DateTime.Now).ToString()).Substring(0, 9);
                        date = date.Replace('/', '-');
                        string location = "\\\\Servidor\\SharedDocs\\Aplicação\\Log";
                        string path = (String.Format("{0}{1}\\Problema Exclusão_{2}.txt", @"", location, date));
                        StreamWriter valor = new StreamWriter(path, true, Encoding.ASCII);
                        valor.WriteLine("Erro ao excluir:" + fornecedorDB.IdFornecedor);
                        valor.WriteLine(ex.Message);
                        valor.WriteLine("------------------------------------------------------");
                        valor.Close();

                        dc.ChangeConflicts.ResolveAll(RefreshMode.OverwriteCurrentValues);
                        dc.SubmitChanges();

                        return true;
                    }
                }
                else
                    return false;
            }
        }

        #endregion

        #region Metodos Privados

        private static DO.Fornecedor FillRecord(DM.Fornecedor fornecedorDB)
        {
            DO.Fornecedor fornecedor = new DO.Fornecedor();

            fornecedor.Id = fornecedorDB.IdFornecedor;
            fornecedor.TipoFornecedor = fornecedorDB.TipoFornecedor;
            fornecedor.RazaoSocial = fornecedorDB.RazaoSocial;
            fornecedor.NomeFantasia = fornecedorDB.NomeFantasia;
            fornecedor.Cnpj = fornecedorDB.Cnpj;
            fornecedor.FoneAberto = fornecedorDB.FoneAberto;
            fornecedor.DtAbertura = fornecedorDB.DtAbertura;
            fornecedor.NomeCompleto = fornecedorDB.NomeCompleto;
            fornecedor.Cpf = (int)fornecedorDB.CPF;
            fornecedor.DtNascimento = fornecedorDB.DtNascimento;
            fornecedor.FoneFixoComercial = fornecedorDB.FoneFixoComercial;
            fornecedor.FoneFixoResidencial = fornecedorDB.FoneFixoResidencial;
            fornecedor.Celular1 = fornecedorDB.Celular1;
            fornecedor.Celular2 = fornecedorDB.Celular2;
            fornecedor.Email = fornecedorDB.Email;
            fornecedor.Logradouro = fornecedorDB.Logradouro;
            fornecedor.Numero = fornecedorDB.Numero;
            fornecedor.Complemento = fornecedorDB.Complemento;
            fornecedor.Bairro = fornecedorDB.Bairro;
            fornecedor.Cidade = fornecedorDB.Cidade;

            return fornecedor;
        }

        #endregion
    }
}
